package cn.edu.lcu.cs.javaprogramming.oop.animal;

import lombok.Data;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

/**
 * 所有动物的基类
 *
 * 2022/3/11 18:38
 *
 * @Author ling
 */
@Data
public abstract class Animal {
    /**
     * 物种名称 <br>
     * 这是不可变更的量，所以声明为final类型。 <br>
     * Lombok @Setter 注解会忽略 final 字段，不为它生成setter方法。
     */
    protected String speciesName;
    /**
     * 名字
     */
    private String name;
    /**
     * 出生日期 <br>
     * 这是一个Field字段，不是JavaBean的属性Property。 <br>
     * JavaBean的getter或者setter，去掉前缀get或set，剩下的部分首字母小写，就是JavaBean的属性名称。
     */
    private LocalDate birthDate;
    /**
     * 颜色
     */
    private String color;
    /**
     * 性别
     */
    private String gender;
    /**
     * 品种名称
     */
    private String breed;
    /**
     * 原产地
     */
    private String origin;
    private double weight;
    private double height;
    private double length;

    public Animal() {
        speciesName = "哺乳动物";
    }

    public int getAge() {
        if (birthDate != null) {
            return (int) birthDate.until(LocalDate.now(), ChronoUnit.YEARS);
        } else {
            return -1;
        }
    }

    /**
     * 呼吸方式不同，抽象方法。
     */
    public abstract void breath();

    /**
     * 生殖方式不同，抽象方法。
     */
    public abstract void reproduce();

    /**
     * 养育后代方式不同，抽象方法。
     */
    public abstract void feed();

    /**
     * 进食方式不同，抽象方法。
     */
    public abstract void eat();
}
